/*
* 剪枝方法
* 1.优化搜索顺序：层间从上到下 层中半径和高度从大到小
* 2.排除等效冗余：
* 3.可行性剪枝:不符合规则，直接剪枝
* 4.最优化剪枝：不是最优解，直接剪枝
* 5.记忆化搜索：DP
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
// #define ONLINE_GUDGE
const int N = 22, INF = 0x3f3f3f3f;

int n, m, ans = INF;
int H[N], R[N]; // 高 半径
bool mins[N], minv[N]; // 最小表面积 最小体积


void dfs(int u, int v, int s) // 当前层次 当前处理体积和 当前处理面积和
{
    // 可行性剪枝
    if(u + minv[v] > n) return; 
    if(s + mins[u] >= ans) return; // 
    if (s + 2 * (n - v) / R[u + 1] >= ans) return;

    if (!u) {
        if (v == n) ans = s;
        return ;
    }
    // 优化搜索顺序
    for (int r = min (R[u + 1] - 1,int(sqrt (n - v)));r >= u;r--) {
        for (int h = min (H[u + 1] - 1,(n - v) / r / r);h >= u;h--) {
            int t = 0;

            // 最低层
            if (u == m) t = r * r;
            H[u] = h,R[u] = r;
            dfs (u - 1,v + h * r * r,s + 2 * r * h + t);
        }
    }
}

int main()
{
    #ifdef ONLINE_GUDGE

    #else
        freopen("./in.txt", "r", stdin);
    #endif
    ios::sync_with_stdio(0); cin.tie(0);

    cin >> n >> m;
    for (int i = 1;i <= m;i++) {
        minv[i] = minv[i - 1] + i * i * i;
        mins[i] = mins[i - 1] + 2 * i * i;
    }

    // 边界处理
    R[m + 1] = H[m + 1] = INF;
    dfs (m,0,0);
    if (ans == INF) ans = 0;
    cout << ans << endl;
    return 0;
}